package com.unitd.logistics.comm.plugins.module.service;

import com.github.pagehelper.PageInfo;

import java.util.List;

/**
 * 所有自定义Service的顶级接口,封装常用的增删查改操作
 *
 * @param <Model> 代表数据库中的表 映射的Java对象类型
 * @param <PK>    对象的主键类型
 * @author Hudan
 * @version 1.0
 * @filename IBaseService.java
 * @copyright www.pactera.com
 * @date 2019-01-23
 */
public interface IBaseService<Model, PK> {

	/**
	 * 保存(持久化)对象(完全保存)
	 *
	 * @param entity 要持久化的对象
	 */
	int insert(Model entity);

	/**
	 * 保存(持久化)对象(非空字段保存,空字段按照默认值)
	 *
	 * @param entity 要持久化的对象
	 */
	int insertSelective(Model entity);

	/**
	 * 批量保存(持久化)对象(完全保存)
	 *
	 * @param models 要持久化的对象列表
	 */
	int batchInsert(List<Model> models);

	/**
	 * 批量保存(持久化)对象(非空字段保存,空字段按照默认值)
	 *
	 * @param models 要持久化的对象列表
	 */
	int batchInsertSelective(List<Model> models);

	/**
	 * 根据指定的唯一标识符删除持久化对象
	 *
	 * @param id 指定的唯一标识符
	 */
	int deleteByPrimaryKey(PK id);

	/**
	 * 根据指定的唯一标识符列表,批量删除持久化对象
	 *
	 * @param ids 指定的唯一标识符列表
	 */
	int batchDeleteByPrimaryKey(List<PK> ids);

	/**
	 * 更新(持久化)对象
	 *
	 * @param entity (持久化)对象
	 */
	int updateByPrimaryKey(Model entity);

	/**
	 * 更新(持久化)对象
	 *
	 * @param entity (持久化)对象
	 */
	int updateByPrimaryKeySelective(Model entity);

	/**
	 * 批量更新(持久化)对象(完全更新)
	 *
	 * @param models 要持久化的对象列表
	 */
	int batchUpdateByPrimaryKey(List<Model> models);

	/**
	 * 批量更新(持久化)对象(非空字段更新,空字段按照默认值)
	 *
	 * @param models 要持久化的对象列表
	 */
	int batchUpdateByPrimaryKeySelective(List<Model> models);

	/**
	 * 获取指定的唯一标识符对应的持久化对象
	 *
	 * @param id 指定的唯一标识符
	 * @return 指定的唯一标识符对应的持久化对象，如果没有对应的持久化对象，则返回null。
	 */
	Model selectByPrimaryKey(PK id);

	/**
	 * 获取指定条件对应的持久化对象
	 *
	 * @param model 查询条件
	 * @return 指定的唯一标识符对应的持久化对象，如果没有对应的持久化对象，则返回null。
	 */
	Model selectByBean(Model model);

	/**
	 * 获取指定条件对应的持久化对象的记录条数
	 *
	 * @param model 查询条件
	 * @return 记录条数
	 */
	int selectCountByExample(Object model);

	/**
	 * 获取指定条件对应的持久化对象列表
	 *
	 * @param param 查询条件
	 * @return 指定的唯一标识符对应的持久化对象，如果没有对应的持久化对象，则返回null。
	 */
	List<Model> selectByExample(Object param);

	/**
	 * 根据指定查询条件,获取对应的记录列表
	 *
	 * @param model 查询条件
	 * @return 指定持久对象的所有 记录,如果没有对应的持久化对象，则返回null。
	 */
	List<Model> listByBean(Model model);

	/**
	 * 获取所有记录
	 *
	 * @return 指定持久对象的所有 记录,如果没有对应的持久化对象，则返回null。
	 */
	List<Model> listAll();

	/**
	 * 查询分页数据
	 *
	 * @param pageNo   当前页数
	 * @param pageSize 每页记录数
	 * @return PageInfo
	 */
	PageInfo<Model> getPageData(int pageNo, int pageSize);

	/**
	 * 根据指定查询条件和分页参数,查询分页数据
	 *
	 * @param pageNo   当前页数
	 * @param pageSize 每页记录数
	 * @param model    查询条件
	 * @return PageInfo
	 */
	PageInfo<Model> getPageData(int pageNo, int pageSize, Model model);

	/**
	 * 根据指定查询条件和分页参数,查询分页数据,实际查询调用指定的方法
	 *
	 * @param pageNo     当前页数
	 * @param pageSize   每页记录数
	 * @param model      查询条件
	 * @param methodName 需要进行反射处理的数据操作方法
	 * @return PageInfo
	 */
	PageInfo<Model> getPageData(int pageNo, int pageSize, final Model model, String methodName);
}